package com.allwees.bs.module.core.sender.req;

import cn.hutool.core.util.NumberUtil;
import com.allwees.bs.core.modelbase.req.SignedReq;
import com.allwees.bs.core.modelbase.validate.ValidateItem;
import com.allwees.core.common.constant.EPlatform;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

/**
 * 发送SMS请求
 *
 * @author yangylsky
 * @since 2020-01-02
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class SendSmsReq extends SignedReq {
    protected EPlatform platform = EPlatform.PC;

    protected String bsType;

    protected String mobile;

    protected Integer tag;

    @Override
    public ValidateItem[] getValidateItems() {
        return ArrayUtils.addAll(
                super.getValidateItems(),
                ValidateItem.of(platform == null, "platform 不能为空"),
                ValidateItem.of(StringUtils.isEmpty(bsType), "bsType 不能为空"),
                ValidateItem.of(StringUtils.isEmpty(mobile), "mobile 不能为空"),
                ValidateItem.of(!isValidTag(), "tag不合法")
        );
    }

    /**
     * <ol>已登录用户不校验tag；未登录情况下，验证方法：
     * 	<li>tag为一个6位整数</li>
     * 	<li>前3位能被第4位整除</li>
     * 	<li>第4位不为0</li>
     * 	<li>后2位是一个素数</li>
     * </ol>
     *
     * @return
     */
    private boolean isValidTag() {
        if (isValidBranchUser()) {//如果当前请求有合法登录机构用户
            return true;
        }
        if (100000 < tag && tag < 999999) {
            int part1 = Integer.valueOf(tag.toString().substring(0, 3));
            int part2 = Integer.valueOf(tag.toString().substring(3, 4));
            int part3 = Integer.valueOf(tag.toString().substring(4));
            return part2 != 0
                    && part1 % part2 == 0
                    && NumberUtil.isPrimes(part3);
        }
        return false;
    }

    @Override
    protected Object[] signValues() {
        return new Object[]{platform.name(), bsType, mobile, time.getTime()};
    }

    @Override
    protected String signSeparator() {
        return platform.isApp() ? "_AS_" : "_PC_";
    }
}
